<?php

App::import('Sanitize');

class RutasController extends AppController {

    var $name = 'Rutas';
    var $paginate = array(
        'order' => array('Ruta.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //parent::beforeFilter();
    }

    function index($rutas_tipo_id = null, $tipologias_viale_id = null, $ruta_id = null) {
        $this->__aux_index($rutas_tipo_id, $tipologias_viale_id, $ruta_id);
    }

    function admin_index($rutas_tipo_id = null, $tipologias_viale_id = null, $ruta_id = null) {
        $this->__aux_index($rutas_tipo_id, $tipologias_viale_id, $ruta_id);
    }

    /**
     * Lista todas las rutas
     */
    function __aux_index($rutas_tipo_id = null, $tipologias_viale_id = null, $ruta_id = null) {
        $this->Ruta->recursive = 0;
        $this->paginate['order'] = 'Ruta.nombre';

        $condiciones = array();

        $tipos_rutas = $this->RutasTipo->find('list', array('fields' => array('RutasTipo.id', 'RutasTipo.nombre'), 'order' => 'RutasTipo.nombre'));
        $tipos_rutas['0'] = 'Todos';
        if (!empty ($rutas_tipo_id))
            $this->data['Ruta']['rutas_tipo_id'] = $rutas_tipo_id;

        $tipologias = $this->TipologiasViale->find('list', array('fields' => array('TipologiasViale.id', 'TipologiasViale.nombre'), 'order' => 'TipologiasViale.nombre'));
        $tipologias['0'] = 'Todas';
        if (!empty ($tipologias_viale_id))
            $this->data['Ruta']['tipologias_viale_id'] = $tipologias_viale_id;

        $lista_rutas = array();
        if (!empty ($ruta_id))
            $this->data['Ruta']['ruta_id'] = $ruta_id;

        $nombre = '';
        
        //si vienen datos del filtro
        if (!empty($this->data)) {

            if (isset ($this->data['Ruta']['rutas_tipo_id']) && !empty($this->data['Ruta']['rutas_tipo_id'])) {
                $condiciones[] = "RutasTipo.id = {$this->data['Ruta']['rutas_tipo_id']}";
            }

            if (isset ($this->data['Ruta']['rutas_tipo_id']) && (!empty($this->data['Ruta']['rutas_tipo_id']) || ($this->data['Ruta']['rutas_tipo_id'] == '0'))) {
                $rutas_tipo_id = $this->data['Ruta']['rutas_tipo_id'];
                $this->Session->write('rutas_tipo_id', $rutas_tipo_id);
            }

            if (isset ($this->data['Ruta']['tipologias_viale_id']) && !empty($this->data['Ruta']['tipologias_viale_id'])) {
                $condiciones[] = "TipologiasViale.id = {$this->data['Ruta']['tipologias_viale_id']}";
            }

            if (isset ($this->data['Ruta']['tipologias_viale_id']) && (!empty($this->data['Ruta']['tipologias_viale_id']) || ($this->data['Ruta']['tipologias_viale_id'] == '0'))) {
                $tipologias_viale_id = $this->data['Ruta']['tipologias_viale_id'];
                $this->Session->write('tipologias_viale_id', $tipologias_viale_id);
            }

            if (isset($this->data['Ruta']['ruta_id']) && !empty($this->data['Ruta']['ruta_id'])) {
                $condiciones[] = "Ruta.id = {$this->data['Ruta']['ruta_id']}";
            }

            if (isset($this->data['Ruta']['ruta_id']) && (!empty($this->data['Ruta']['ruta_id']) || ($this->data['Ruta']['ruta_id'] == '0'))) {
                $ruta_id = $this->data['Ruta']['ruta_id'];
                $id_tipo_ruta = $this->data['Ruta']['rutas_tipo_id'];
                $id_tipologia_vial = $this->data['Ruta']['tipologias_viale_id'];
                if (empty($id_tipo_ruta) && empty($id_tipologia_vial)) {
                    $lista_rutas = $this->Ruta->find('list', array('fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
                } elseif (!empty($id_tipo_ruta) && !empty($id_tipologia_vial)) {
                    $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.rutas_tipo_id' => $id_tipo_ruta, 'Ruta.tipologias_viale_id' => $id_tipologia_vial),
                                'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
                } elseif (!empty($id_tipo_ruta) && empty($id_tipologia_vial)) {
                    $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.rutas_tipo_id' => $id_tipo_ruta),
                                'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
                } else {
                    $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.tipologias_viale_id' => $id_tipologia_vial),
                                'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
                }
                $lista_rutas[0] = 'Todas';
                $this->Session->write('ruta_id', $ruta_id);
                $this->Session->write('lista_rutas', $lista_rutas);
            }

            if (isset($this->data['Ruta']['nombre']) && !empty($this->data['Ruta']['nombre'])) {
                $ruta = utf8_encode(strtolower(utf8_decode(trim($this->data['Ruta']['nombre']))));
                $condiciones[] = "lower(Ruta.nombre) LIKE '%{$ruta}%'";
                $nombre = $this->data['Ruta']['nombre'];
                $this->Session->write('nombre', $nombre);
            }
            $this->Session->write('rutas_filter', $condiciones);
        } elseif ($this->Session->check('rutas_filter')) {//si tengo cargado un filtro en session
            //me fijo si esta cambiando de pagina o cambiando el limit
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                //si ya estaba siendo aplicado un filtro, lo sigo usando
                $condiciones = $this->Session->read('rutas_filter');
                $rutas_tipo_id = ($this->Session->check('rutas_tipo_id')) ? $this->Session->read('rutas_tipo_id') : '';
                $tipologias_viale_id = ($this->Session->check('tipologias_viale_id')) ? $this->Session->read('tipologias_viale_id') : '';
                $ruta_id = ($this->Session->check('ruta_id')) ? $this->Session->read('ruta_id') : '';
                $lista_rutas = ($this->Session->check('lista_rutas')) ? $this->Session->read('lista_rutas') : array();
                $nombre = ($this->Session->check('nombre')) ? $this->Session->read('nombre') : '';
            } else {
                //sino, lo borro de la session
                $this->Session->delete('rutas_filter');
                $this->Session->delete('rutas_tipo_id');
                $this->Session->delete('tipologias_viale_id');
                $this->Session->delete('ruta_id');
                $this->Session->delete('lista_rutas');
                $this->Session->delete('nombre');
            }
        }

        $this->paginate['conditions'] = $condiciones;
        $referer = $this->referer();
        $this->set(compact('lista_rutas', 'ruta_id', 'tipos_rutas', 'rutas_tipo_id', 'tipologias', 'tipologias_viale_id', 'nombre', 'referer'));
        $this->set('rutas', $this->paginate());
        $this->render('index');
    }

    function view_rutas($rutas_tipo_id = null, $tipologias_viale_id = null) {
        $this->__aux_view_rutas($rutas_tipo_id, $tipologias_viale_id);
    }

    function admin_view_rutas($rutas_tipo_id = null, $tipologias_viale_id = null) {
        $this->__aux_view_rutas($rutas_tipo_id, $tipologias_viale_id);
    }

    /**
     *
     * @param <type> $rutas_tipo_id
     * @param <type> $tipologias_viale_id
     */
    function __aux_view_rutas($rutas_tipo_id = null, $tipologias_viale_id = null) {
        $this->layout = false;
        $lista_rutas = array();

        if (empty($rutas_tipo_id) && empty($tipologias_viale_id)) {
            $lista_rutas = $this->Ruta->find('list', array('fields' => array('Ruta.id', 'Ruta.nombre')));
        } elseif (!empty($rutas_tipo_id) && !empty($tipologias_viale_id)) {
            $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.rutas_tipo_id' => $rutas_tipo_id, 'Ruta.tipologias_viale_id' => $tipologias_viale_id),
                        'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        } elseif (!empty($rutas_tipo_id) && empty($tipologias_viale_id)) {
            $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.rutas_tipo_id' => $rutas_tipo_id),
                        'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        } else {
            $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.tipologias_viale_id' => $tipologias_viale_id),
                        'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        }
        $lista_rutas[0] = 'Todas';
        $this->set(compact('rutas_tipo_id', 'tipologias_viale_id', 'lista_rutas'));
        $this->render('view_rutas');
    }

    function delete($id = null) {
        $this->__aux_delete($id);
    }

    function admin_delete($id = null) {
        $this->__aux_delete($id);
    }

    /**
     * Permite eliminar una ruta seleccionada si no existen obras de arte que pertenecen a esa ruta
     * @param <type> $id
     */
    function __aux_delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Ruta inválida', true), 'flash_failure');
        } else {
            // Chequeo que la ruta exista
            $ruta = $this->Ruta->find('all', array('conditions' => array('Ruta.id' => $id)));
            if (!empty($ruta)) {
                $ruta_name = $ruta[0]['Ruta']['nombre'];
                // Chequeo si hay obras de arte que pertenecen a esa ruta
                $obras = $this->Obra->find('all', array('conditions' => array('Obra.ruta_id' => $id)));
                if (!empty($obras)) {
                    $this->Session->setFlash(__('La ruta "' . $ruta_name . '" no se puede eliminar porque existen obras de arte que pertenecen a dicha ruta.', true), 'flash_failure');
                } else {
                    if ($this->Ruta->delete($id)) {
                        $this->Session->setFlash(__('La ruta "' . $ruta_name . '" se eliminó correctamente.', true), 'flash_success');
                    } else {
                        $this->Session->setFlash(__('La ruta no se pudo eliminar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                }
            } else {
                $this->Session->setFlash(__('Ruta inválida', true), 'flash_failure');
            }
        }
        $this->redirect(array('action' => 'admin_index'));
    }

    function add($rutas_tipo_id = null, $tipologias_viale_id = null) {
        $this->__aux_add($rutas_tipo_id, $tipologias_viale_id);
    }

    function admin_add($rutas_tipo_id = null, $tipologias_viale_id = null) {
        $this->__aux_add($rutas_tipo_id, $tipologias_viale_id);
    }

    /**
     * Permite dar de alta una nueva ruta
     */
    function __aux_add($rutas_tipo_id = null, $tipologias_viale_id = null) {
        $rutas_tipo_id = (empty($rutas_tipo_id)) ? '' : $rutas_tipo_id;
        $tipologias_viale_id = (empty($tipologias_viale_id)) ? '' : $tipologias_viale_id;

        if (!empty($this->data)) {
            $ruta_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Ruta']['nombre']))));
            $rutas_tipo_id = trim($this->data['Ruta']['rutas_tipo_id']);
            $tipologias_viale_id = trim($this->data['Ruta']['tipologias_viale_id']);

            // Chequeo si existe en la db una ruta con el mismo nombre, el mismo tipo y la misma tipología vial
            $ruta = $this->Ruta->find('all', array('conditions' => array('lower(Ruta.nombre)' => $ruta_name, 'Ruta.rutas_tipo_id' => $rutas_tipo_id, 'Ruta.tipologias_viale_id' => $tipologias_viale_id)));
            if (empty($ruta)) {
                $this->Ruta->create();
                if ($this->Ruta->save($this->data)) {
                    $ruta_id = $this->Ruta->id;
                    $this->Session->setFlash(__('La ruta se guardó correctamente.', true), 'flash_success');
                    $this->redirect(array('action' => 'admin_index', $rutas_tipo_id, $tipologias_viale_id, $ruta_id));
                } else {
                    $this->Session->setFlash(__('La ruta no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                }
            } else {
                $ruta_tipo = $this->Ruta->RutasTipo->find('all', array('conditions' => array('RutasTipo.id' => $rutas_tipo_id)));
                $ruta_tipo_name = $ruta_tipo[0]['RutasTipo']['nombre'];

                $ruta_tipologia_vial = $this->Ruta->TipologiasViale->find('all', array('conditions' => array('TipologiasViale.id' => $tipologias_viale_id)));
                $ruta_tipologia_vial_name = $ruta_tipologia_vial[0]['TipologiasViale']['nombre'];

                $this->Session->setFlash(__('La ruta "' . $this->data['Ruta']['nombre'] . '" del tipo "' . $ruta_tipo_name . '" y tipología vial "' . $ruta_tipologia_vial_name . '" ya existe.', true), 'flash_failure');
            }
        }
        $rutasTipos = $this->Ruta->RutasTipo->find('list', array('fields' => array('RutasTipo.id', 'RutasTipo.nombre'), 'order' => 'RutasTipo.nombre'));
        $tipologiasViales = $this->Ruta->TipologiasViale->find('list', array('fields' => array('TipologiasViale.id', 'TipologiasViale.nombre'), 'order' => 'TipologiasViale.nombre'));

        $referer = $this->referer();
        $this->set(compact('rutasTipos', 'tipologiasViales', 'referer', 'rutas_tipo_id', 'tipologias_viale_id'));
        $this->render('add');
    }

    function edit($id = null) {
        $this->__aux_edit($id);
    }

    function admin_edit($id = null) {
        $this->__aux_edit($id);
    }

    /**
     * Permite editar una ruta existente
     */
    function __aux_edit($id = null) {
        $rutas_tipo_id = 0;
        $tipologias_viale_id = 0;
        if (empty($id) && empty($this->data)) {
            $this->Session->setFlash(__('Ruta inválida', true), 'flash_failure');
            $this->redirect(array('action' => 'admin_index'));
        } elseif (empty($this->data)) {
            $this->data = $this->Ruta->read(null, $id);
            $rutas_tipo_id = $this->data['Ruta']['rutas_tipo_id'];
            $tipologias_viale_id = $this->data['Ruta']['tipologias_viale_id'];
        } elseif (!empty($this->data)) {
            $ruta_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Ruta']['nombre']))));
            $rutas_tipo_id = trim($this->data['Ruta']['rutas_tipo_id']);
            $tipologias_viale_id = trim($this->data['Ruta']['tipologias_viale_id']);

            // Chequeo si existe en la db una ruta con el mismo nombre, el mismo tipo y la misma tipología vial
            $ruta = $this->Ruta->find('all', array('conditions' => array("Ruta.id <>" => $id, 'lower(Ruta.nombre)' => $ruta_name, 'Ruta.rutas_tipo_id' => $rutas_tipo_id, 'Ruta.tipologias_viale_id' => $tipologias_viale_id)));
            if (empty($ruta)) {
                if ($this->Ruta->save($this->data)) {
                    $this->Session->setFlash(__('La ruta se guardó correctamente.', true), 'flash_success');
                    $this->redirect(array('action' => 'admin_index', $rutas_tipo_id, $tipologias_viale_id, $id));
                } else {
                    $this->Session->setFlash(__('La ruta no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                }
            } else {
                $ruta_tipo = $this->Ruta->RutasTipo->find('all', array('conditions' => array('RutasTipo.id' => $rutas_tipo_id)));
                $ruta_tipo_name = $ruta_tipo[0]['RutasTipo']['nombre'];

                $ruta_tipologia_vial = $this->Ruta->TipologiasViale->find('all', array('conditions' => array('TipologiasViale.id' => $tipologias_viale_id)));
                $ruta_tipologia_vial_name = $ruta_tipologia_vial[0]['TipologiasViale']['nombre'];

                $this->Session->setFlash(__('La ruta "' . $this->data['Ruta']['nombre'] . '" del tipo "' . $ruta_tipo_name . '" y tipología vial "' . $ruta_tipologia_vial_name . '" ya existe.', true), 'flash_failure');
            }
        }
        $rutasTipos = $this->Ruta->RutasTipo->find('list', array('fields' => array('RutasTipo.id', 'RutasTipo.nombre'), 'order' => 'RutasTipo.nombre'));
        $tipologiasViales = $this->Ruta->TipologiasViale->find('list', array('fields' => array('TipologiasViale.id', 'TipologiasViale.nombre'), 'order' => 'TipologiasViale.nombre'));
        $referer = $this->referer();
        $this->set(compact('rutasTipos', 'rutas_tipo_id', 'tipologiasViales', 'tipologias_viale_id', 'referer'));
        $this->render('edit');
    }

    //********************************************//
    //***************** MAPA *********************//
    //********************************************//

    function view_rutas_mapa($id_tipo_ruta = null, $id_tipologia_vial = null) {
        $this->__aux_view_rutas_mapa($id_tipo_ruta, $id_tipologia_vial);
    }

    function admin_view_rutas_mapa($id_tipo_ruta = null, $id_tipologia_vial = null) {
        $this->__aux_view_rutas_mapa($id_tipo_ruta, $id_tipologia_vial);
    }

    /**
     *
     * @param <type> $id_tipo_ruta
     * @param <type> $id_tipologia_vial
     */
    function __aux_view_rutas_mapa($id_tipo_ruta = null, $id_tipologia_vial = null) {
        $this->layout = false;
        $lista_rutas = array();

        if (empty($id_tipo_ruta) && empty($id_tipologia_vial)) {
            $lista_rutas = $this->Ruta->find('list', array('fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        } elseif (!empty($id_tipo_ruta) && !empty($id_tipologia_vial)) {
            $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.rutas_tipo_id' => $id_tipo_ruta, 'Ruta.tipologias_viale_id' => $id_tipologia_vial),
                        'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        } elseif (!empty($id_tipo_ruta) && empty($id_tipologia_vial)) {
            $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.rutas_tipo_id' => $id_tipo_ruta),
                        'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        } else {
            $lista_rutas = $this->Ruta->find('list', array('conditions' => array('Ruta.tipologias_viale_id' => $id_tipologia_vial),
                        'fields' => array('Ruta.id', 'Ruta.nombre'), 'order' => 'Ruta.nombre'));
        }
        $lista_rutas[0] = 'Todas';
        $this->set(compact('id_tipo_ruta', 'id_tipologia_vial', 'lista_rutas'));
        $this->render('view_rutas_mapa');
    }

}
?>